//////////////////////////////////////////////////////////////////////////////
//       Copyright (c) 2003 - RealTime Gaming.  All rights reserved.        //
//////////////////////////////////////////////////////////////////////////////

#ifndef LOCALEFORMATTER_H
#define LOCALEFORMATTER_H

//////////////////////////////////////////////////////////////////////////////
// Includes
//////////////////////////////////////////////////////////////////////////////
#include "lib.h"
#include "ustring.h"

//////////////////////////////////////////////////////////////////////////////
// Declare Namespace
//////////////////////////////////////////////////////////////////////////////
namespace Library
{

//////////////////////////////////////////////////////////////////////////////
/// LocaleValue class.  This is an abstract base class for locale specific
///  values.
//////////////////////////////////////////////////////////////////////////////
class PLIBEXP LocaleValue
{
public:
	LocaleValue() {};
	virtual ~LocaleValue() {};

	virtual void Format( String& string ) = 0;
};

//////////////////////////////////////////////////////////////////////////////
/// CurrencyValue class.  Abstract base class for all currency types.
//////////////////////////////////////////////////////////////////////////////
class PLIBEXP CurrencyValue : public LocaleValue
{
public:
	CurrencyValue() {};
	~CurrencyValue() {};

	virtual void Format( String& string ) = 0;
    virtual void SetValue( int32 nValue ) = 0;
};

//////////////////////////////////////////////////////////////////////////////
/// DollarValueEnglish class.
//////////////////////////////////////////////////////////////////////////////
class PLIBEXP DollarValueEnglish : public CurrencyValue
{
public:
	DollarValueEnglish();
	~DollarValueEnglish();

    // Base class overrides
	virtual void Format( String& string );
    virtual void SetValue( int32 nValue );
    
protected:
	int32 m_nValue;             /**< Internal Value    */
};

//////////////////////////////////////////////////////////////////////////////
/// StringValue class.  Abstract base class for all currency types.
//////////////////////////////////////////////////////////////////////////////
class PLIBEXP StringValue : public LocaleValue
{
public:
	StringValue() {};
	~StringValue() {};

	virtual void Format( String& string ) = 0;
    virtual void SetValue( const String& sValue ) = 0;
};

//////////////////////////////////////////////////////////////////////////////
/// StringValueEnglish class.
//////////////////////////////////////////////////////////////////////////////
class PLIBEXP StringValueEnglish : public StringValue
{
public:
	StringValueEnglish();
	~StringValueEnglish();

    // Base class overrides
	virtual void Format( String& string );
    virtual void SetValue( const String& sValue );
    
protected:
	String m_sValue;             /**< Internal Value    */
};

//****************************************************************************

//////////////////////////////////////////////////////////////////////////////
/// LocaleFormatter class.  This class is basically a factory for creating
///  "locale value" objects, which are objects that hold values and know how
///  how to format themselves for different locales.
//////////////////////////////////////////////////////////////////////////////
class PLIBEXP LocaleFormatter
{
public:
    enum ValueTypes { eString, eCurrency };

public:
	LocaleFormatter();
	~LocaleFormatter();

    String GetCurrentLanguageCode();
	void SetCurrentLanguageCode(const String& code);
    LocaleValue* CreateValue( ValueTypes type );

protected:
	String	m_code;
};

} // namespace Library

#endif // #ifndef LOCALEFORMATTER_H
